package cn.iocoder.yudao.module.resource.dal.dataobject.message;

import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import lombok.*;

import java.util.List;

/**
 * 对话 DO
 *
 * @author lizhongwen
 */
@TableName(value = "lm_message", autoResultMap = true)
@KeySequence("lm_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageDO extends BaseDO {

    /**
     * 唯一自增id
     */
    @TableId
    private String messageId;

    /**
     * 会话id(对话级别)
     */
    private String wsSessionId;

    /**
     * 日志追踪id
     */
    private String traceId;

    /**
     * 角色id
     */
    private Integer roleId;

    /**
     * 消息来源
     */
    private Integer senderType;

    /**
     * 用户消息
     */
    private String userText;
    private String userTextHash;

    /**
     * 回复消息
     */
    private String replyText;
    private String replyTextHash;

    /**
     * 消息类型, 1: 文本/音频, 2: 图片, 3: 视频
     */
    private Integer contentType;

    /**
     * 音频数据
     */
    @TableField(typeHandler = AudioDataTypeHandler.class)
    private List<AudioData> audioData;
    /**
     * AI生成回复的时间 (毫秒)
     */
    private Integer responseTimeMs;
    /**
     * 扩展
     */
    private String extension;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 对局id
     */
    private String gameMatchId;

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class AudioData {
        private String id;
        private String sentence;
        private String path;
    }

    public static class AudioDataTypeHandler extends AbstractJsonTypeHandler<Object> {

        @Override
        protected Object parse(String json) {
            return JsonUtils.parseArray(json, AudioData.class);
        }

        @Override
        protected String toJson(Object obj) {
            return JsonUtils.toJsonString(obj);
        }

    }

}